<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 skin-theme-clientpref-day vector-sticky-header-enabled" lang="de" dir="ltr"><head>
<meta charset="UTF-8">
<title>Universal Binary</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://de.wikipedia.org/wiki/Universal_Binary"> <link href="./_mw_/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link href="./_mw_/ext.gadget.citeRef.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.defaultPlainlinks.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonHide.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonLayout.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonStyle.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiDarkmode.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiResponsive.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.specialSearch.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Universal_Binary rootpage-Universal_Binary skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">Universal Binary</span></h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="de" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="de" dir="ltr">
<p><b><span lang="en">Universal Binaries</span></b> (auf Deutsch in etwa <i>universelle Binärdateien</i>), oft abgekürzt mit <b>UB</b>, sind im <a href="Apple" title="Apple">Apple</a>-Jargon <a href="Ausf%C3%BChrbare_Datei" title="Ausführbare Datei">ausführbare Dateien</a> (d. h. <a href="Computerprogramm" title="Computerprogramm">Programme</a>), die nativ ausführbare <a href="Maschinensprache" title="Maschinensprache">Maschinensprache</a> für mehr als eine <a href="Prozessorarchitektur" title="Prozessorarchitektur">Prozessorarchitektur</a> enthalten. Apple hat <i><span lang="en">Universal Binaries</span></i> bei der Umstellung von <a href="PowerPC" title="PowerPC">PowerPC</a>- auf Intel-<a href="X86-Prozessor" title="X86-Prozessor">x86</a>-Prozessoren ab 2005 verwendet. Die Technik wurde zudem in <a href="Xcode" title="Xcode">Xcode</a> integriert, damit erstellte und entsprechend <a href="Compiler" title="Compiler">kompilierte</a> Applikationen konnten nativ sowohl auf PowerPC- als auch auf Intel-<a href="Macintosh" title="Macintosh">Macs</a> laufen. Bei der Umstellung von Intel auf <a href="Arm-Architektur" class="mw-redirect" title="Arm-Architektur">Arm</a> seit 2020 wird mit <i><span lang="en">Universal Binary</span> 2</i> dieselbe Technik noch einmal verwendet und ebenfalls in Xcode integriert.
</p>
<div class="mw-heading mw-heading2"><h2 id="Geschichte">Geschichte</h2></div>
<p><i><span lang="en">Universal Binaries</span></i> basieren auf dem mit <a href="Mach_(Kernel)" title="Mach (Kernel)">MACH</a> Mitte der 1980er Jahre entworfenen <a href="Mach-O" title="Mach-O">Mach-O</a>-<a href="Bin%C3%A4rdatei" title="Binärdatei">Binärformat</a>. Unter <a href="OPENSTEP" title="OPENSTEP">NeXTStep</a>, ab 1987 auf der Basis von Mach Version 2 entwickelt, wurde das Format auf die vom <a href="Betriebssystem" title="Betriebssystem">Betriebssystem</a> (ab NeXTStep 3.1 von 1993) unterstützten Architekturen <a href="Motorola-68000er-Familie" title="Motorola-68000er-Familie">m68k</a>, <a href="IA-32" title="IA-32">IA-32</a> „i386“ (32-Bit-<a href="X86-Prozessor" title="X86-Prozessor">x86</a>), <a href="PA-RISC" title="PA-RISC">PA-RISC</a> und <a href="SPARC-Architektur" title="SPARC-Architektur">SPARC</a> erweitert und <i><span lang="en">Multi-Architecture Binaries</span></i> genannt.
</p><p>Auch Apple hatte ab 1994 bereits eine Umstellung der Prozessorarchitektur unter dem Betriebssystem <a href="System_7" title="System 7">System 7</a> von der m68k auf die PowerPC-Architektur durchgeführt und dabei mit <i><span lang="en">Fat Binaries</span></i> ein ähnliches Konzept umgesetzt. Das verwendete Binärformat ist jedoch nicht mit dem von Mach-O verwandt.
</p><p>Apple erwarb 1997 NeXT samt dem von NeXTSTEP in <a href="OPENSTEP" title="OPENSTEP">OPENSTEP</a> umbenannten Mach-Betriebssystem und portierte es im Project <a href="Rhapsody_(Betriebssystem)" title="Rhapsody (Betriebssystem)">Rhapsody</a> auf die von Apple damals genutzte PowerPC-Plattform. Rhapsody hätte das <a href="Mac_OS_(Classic)" title="Mac OS (Classic)">klassische Mac OS</a> vollständig ersetzen sollen, war jedoch ein vollkommen anderes Betriebssystem und mit bestehenden <a href="Mac_OS_(Apple)" title="Mac OS (Apple)">Mac-OS</a>-Programmen nicht kompatibel. Als Rhapsody von den Herstellern wichtiger Anwendungssoftware nicht angenommen wurde, portierte Apple große Teile der Mac-OS-<a href="Programmierschnittstelle" title="Programmierschnittstelle">Programmierschnittstelle</a> unter dem Namen <a href="Carbon_(Apple)" title="Carbon (Apple)">Carbon</a> auf das nun von Rhapsody in <a href="MacOS" title="MacOS">Mac OS X</a> umbenannte neue Betriebssystem. Das Mach-O-Format besteht seither mit Mac OS X weiter, wurde anfangs jedoch nur mehr für eine einzige Architektur verwendet: die PowerPC-Architektur.
</p><p>2005, mit der Umstellung von der PowerPC- auf die <a href="IA-32" title="IA-32">IA-32</a>-Architektur, griff Apple die ohnehin noch vorhandene Technik der <i><span lang="en">Multi-Architecture Binaries</span></i> wieder auf: Auf der <span lang="en"><a href="Worldwide_Developers_Conference" title="Worldwide Developers Conference">Worldwide Developers Conference</a></span> (WWDC) wurde es, umbenannt in <i><span lang="en">Universal Binaries</span></i>, der Öffentlichkeit vorgestellt. Apple integrierte die Technik in die eigene Entwicklungsumgebung <a href="Xcode" title="Xcode">Xcode</a>, um es den Entwicklern von Anwendungsprogrammen zu erleichtern, nativen Binärcode für beide Architekturen in ihre Softwareprodukte zu integrieren. In diesem Zuge war es auch möglich, sowohl 32- als auch 64-Bit-Binärcode für dieselbe Architektur in einem <i><span lang="en">Universal Binary</span></i> unterzubringen, also sowohl 32-Bit- und 64-Bit-x86 als auch 32-Bit- und 64-Bit-PowerPC. Nach dem erfolgten Übergang auf IA-32 (32-Bit-x86) bzw. x64 (64-Bit-x86) wurde die Unterstützung für PowerPC/x86-<span lang="en">Universal-Binaries</span> wieder aus Xcode entfernt. <a href="IOS_(Betriebssystem)" title="IOS (Betriebssystem)">iOS</a> unterstützt <i><span lang="en">Universal Binaries</span></i> ebenfalls, wodurch <a href="Mobile_App" title="Mobile App">Mobile Apps</a> für verschiedene <a href="Arm-Architektur" class="mw-redirect" title="Arm-Architektur">Arm-Architekturen</a> ermöglicht werden.
</p>
<div class="mw-heading mw-heading2"><h2 id="Umsetzung">Umsetzung</h2></div>
<p>Um <i><span lang="en">Universal Binaries</span></i> zu verwenden, muss der <a href="Kernel_(Betriebssystem)" title="Kernel (Betriebssystem)">Kernel</a> eines Betriebssystems mit dem von NeXT erweiterten Mach-O-Binärformat umgehen können. Gegenüber dem einfachen Mach-O-Format sind <i><span lang="en">Multi-Architecture Binaries</span></i> in einander gekapselte Mach-O-Dateien, mit zusätzlichen <a href="Metadaten" title="Metadaten">Metadaten</a>. Die Header-Struktur von Mach-O selbst wurde dabei nicht verändert, aber um zusätzliche Flags erweitert:<sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup>
</p>
<ul><li>Architektur-<span lang="en">Magic</span>-Nummern
<ul><li><code>MH_MAGIC</code> repräsentiert Binärcode in Big-Endian-<a href="Byte-Reihenfolge" title="Byte-Reihenfolge">Byte-Reihenfolge</a> in <a href="32-Bit-Architektur" title="32-Bit-Architektur">32-Bit</a></li>
<li><code>MH_CIGAM</code> steht für Binärcode in Little-Endian-Byte-Reihenfolge in 32-Bit</li>
<li><code>MH_MAGIC_64</code> repräsentiert Binärcode in Big-Endian-Byte-Reihenfolge in <a href="64-Bit-Architektur" title="64-Bit-Architektur">64-Bit</a></li>
<li><code>MH_CIGAM_64</code> steht für Binärcode in Little-Endian-Byte-Reihenfolge in 64-Bit</li></ul></li>
<li>CPU-Typ, beispielsweise:
<ul><li><code>CPU_TYPE_POWERPC</code> für 32-Bit-PowerPC</li>
<li><code>CPU_TYPE_POWERPC64</code> für 64-Bit-PowerPC</li>
<li><code>CPU_TYPE_I386</code> für 32-Bit-<a href="X86-Prozessor" title="X86-Prozessor">x86</a> bzw. 32-Bit-IA-32 (ab dem <a href="Intel_80386" title="Intel 80386">Intel 80386</a>, darum i386)</li>
<li><code>CPU_TYPE_X86_64</code> für 64-Bit-x86 bzw. <a href="X64" title="X64">x64</a> (auch x86-64, 64-Bit-IA-32)</li></ul></li></ul>
<p>Eine <i><span lang="en">Universal Binary</span></i> wird beim Ausführen vom <a href="Betriebssystem" title="Betriebssystem">Betriebssystem</a> als solche an ihrem Header erkannt, wodurch das Betriebssystem anschließend anhand der vorhandenen Architektur den jeweiligen ausführbaren Code abarbeiten kann. Noch heute enthalten <a href="Open_Source" title="Open Source">Open-Source</a>-Bestandteile von macOS Hinweise auf m68k, SPARC und weitere CPUs. 2020 wurden 17 verschiedene Architekturen gezählt.<sup id="cite_ref-heiseonline_4842217_2-0" class="reference"><a href="#cite_note-heiseonline_4842217-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup>
</p><p>Dieser Vorgang ermöglicht es nun, eine Anwendung sowohl auf einem Apple <a href="Computer" title="Computer">Computer</a> mit PowerPC- als auch mit Intel-Architektur (<i><span lang="en">Universal Binary</span></i> von 2005) oder mit Intel- als auch mit ARM-Architektur (<i><span lang="en">Universal Binary</span></i> von 2020) ohne Geschwindigkeitsverlust auszuführen.
</p>
<div class="mw-heading mw-heading2"><h2 id="Technisches">Technisches</h2></div>
<p>Realisiert werden Universal Binaries über das Binärformat <a href="Mach-O" title="Mach-O">Mach-O</a>, das im Gegensatz zum <a href="Executable_and_Linking_Format" title="Executable and Linking Format">ELF-Format</a>, welches unter Linux und anderen unixähnlichen Betriebssystemen verbreitet ist, Binärcode für mehrere Architekturen enthalten kann. Mit dem Tool <code>lipo</code><sup id="cite_ref-3" class="reference"><a href="#cite_note-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup> aus <a href="Xcode" title="Xcode">Xcode</a> und <code>objdump</code><sup id="cite_ref-4" class="reference"><a href="#cite_note-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup> aus den <a href="GNU" title="GNU">GNU</a> Binutils kann man die Binärcodes eines Universal Binaries auslesen. Auch <code><a href="File" title="File">file</a></code><sup id="cite_ref-5" class="reference"><a href="#cite_note-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup> gibt einen Überblick über die enthaltenen Architekturen.
</p><p>Der universale <a href="Safari_(Browser)" title="Safari (Browser)">Safari</a>-<a href="Webbrowser" title="Webbrowser">Webbrowser</a> enthielt (ca. 2005/2006) sowohl Code für Intel (<code>i386</code>) als auch für PowerPC (<code>powerpc:common</code>). „<code>mach-o-le</code>“ und „<code>mach-o-be</code>“ stehen für die <a href="Byte-Reihenfolge" title="Byte-Reihenfolge">Byte-Reihenfolgen</a> <i>Little Endian</i> und <i>Big Endian</i>.
</p>
<pre><a href="Prompt" title="Prompt">$</a> objdump -f /Applications/Safari.app/Contents/MacOS/Safari
In archive /Applications/Safari.app/Contents/MacOS/Safari:
/Applications/Safari.app/Contents/MacOS/Safari: file format mach-o-le
architecture: i386, flags 0x000001ff:
HAS_RELOC, EXEC_P, HAS_LINENO, HAS_DEBUG, HAS_SYMS, HAS_LOCALS, DYNAMIC, WP_TEXT, D_PAGED
start address 0x0000000000000000
/Applications/Safari.app/Contents/MacOS/Safari: file format mach-o-be
architecture: powerpc:common, flags 0x000001ff:
HAS_RELOC, EXEC_P, HAS_LINENO, HAS_DEBUG, HAS_SYMS, HAS_LOCALS, DYNAMIC, WP_TEXT, D_PAGED
start address 0x0000000000061830
</pre>
<p>Es gibt auch Programme, die in zwei getrennten Versionen (Intel-Binary und PPC-Binary) angeboten werden, hier muss man sich (sofern man nicht doppelt herunterladen möchte) bereits beim Herunterladen für die richtige Datei entscheiden, was jedoch den Vorteil kleinerer Dateien hat.
</p><p>Bei Programmen für nur eine Architektur wird entsprechend nur ein Binärcode angezeigt:
</p>
<pre><a href="Prompt" title="Prompt">$</a> objdump -f /Applications/VLC.app/Contents/MacOS/VLC
/Applications/VLC.app/Contents/MacOS/VLC: file format mach-o-le
architecture: i386, flags 0x000001ff:
HAS_RELOC, EXEC_P, HAS_LINENO, HAS_DEBUG, HAS_SYMS, HAS_LOCALS, DYNAMIC, WP_TEXT, D_PAGED
start address 0x0000000000000000
</pre>
<p>Ohne zusätzliche Programme lässt sich der Binärcode mit dem Befehl <code><a href="File" title="File">file</a></code> auslesen, also für das obige Beispiel Safari: <code>file /Applications/Safari.app/Contents/MacOS/Safari</code>.
</p>
<div class="mw-heading mw-heading2"><h2 id="„Klassische“_Fat_Binaries"><span id=".E2.80.9EKlassische.E2.80.9C_Fat_Binaries"></span>„Klassische“ Fat Binaries</h2></div>
<p>Schon beim Wechsel von der Motorola-<a href="Motorola_68000er-Familie" class="mw-redirect" title="Motorola 68000er-Familie">68k</a>- auf die <a href="PowerPC" title="PowerPC">PowerPC</a>-Prozessorarchitektur verwendete Apple das Konzept, in derselben Datei Code für mehrere Prozessoren unterzubringen. Damals wurde der Begriff <a href="Fat_Binary" title="Fat Binary">Fat Binary</a> verwendet. Realisiert wurde dies unter <a href="Mac_OS_(Classic)" title="Mac OS (Classic)">klassischem Mac OS</a> jedoch nicht als Mach-O-Datei, sondern als das eigentlich modernere PEF-Dateiformat (Preferred Executable Format). Dabei lag der m68k-Code in der <i>resource fork</i> und der PowerPC-Code in der <i>data fork</i>.
</p>
<div class="mw-heading mw-heading2"><h2 id="Trivia">Trivia</h2></div>
<p>Theoretisch ist es möglich, weit mehr als zwei Architekturen in eine sogenannte Super-<i><span lang="en">Universal Binary</span></i> zu packen, sodass das resultierende Programm anschließend auf zahlreichen Architekturen nativ lauffähig ist.<sup id="cite_ref-heiseonline_4842217_2-1" class="reference"><a href="#cite_note-heiseonline_4842217-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup> Praktisch wurde das z. B. bei der Umstellung von PowerPC auf Intel für bis zu vier Architekturen umgesetzt.<sup id="cite_ref-6" class="reference"><a href="#cite_note-6"><span class="cite-bracket">[</span>6<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading2"><h2 id="Weblinks">Weblinks</h2></div>
<ul><li>Apple: <a rel="nofollow" class="external text" href="http://www.apple.com/de/universal/">„Universal Programme“</a></li></ul>
<div class="mw-heading mw-heading2"><h2 id="Einzelnachweise">Einzelnachweise</h2></div>
<ol class="references">
<li id="cite_note-1"><span class="mw-cite-backlink"><a href="#cite_ref-1">↑</a></span> <span class="reference-text"><span class="cite">William Woodruff: <a rel="nofollow" class="external text" href="https://yossarian.net/res/pub/macho-internals/macho-internals.pdf"><i>Mach-O Internals.</i></a> (PDF; 307 KB) 10. Februar 2016, <span style="white-space:nowrap;">S. 12</span><span style="display:none">;</span><span class="Abrufdatum" style="display:none"> abgerufen am 14. Juli 2020</span> (englisch).</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&rfr_id=info%3Asid%2Fde.wikipedia.org%3AUniversal+Binary&rft.title=Mach-O+Internals&rft.description=Mach-O+Internals&rft.identifier=https%3A%2F%2Fyossarian.net%2Fres%2Fpub%2Fmacho-internals%2Fmacho-internals.pdf&rft.creator=William+Woodruff&rft.date=2016-02-10&rft.language=en"> </span></span>
</li>
<li id="cite_note-heiseonline_4842217-2"><span class="mw-cite-backlink">↑ <sup><a href="#cite_ref-heiseonline_4842217_2-0">a</a></sup> <sup><a href="#cite_ref-heiseonline_4842217_2-1">b</a></sup></span> <span class="reference-text">Ben Schwan: <a rel="nofollow" class="external text" href="https://heise.de/-4842217"><span style="font-style:italic;">macOS: Universal Binaries mit ARM, Intel und PowerPC.</span></a> In: <i><a href="Heise_online" title="Heise online">Heise online</a>.</i> <span style="white-space:nowrap;">14. Juli 2020</span>. Abgerufen am 14. Juli 2020.</span>
</li>
<li id="cite_note-3"><span class="mw-cite-backlink"><a href="#cite_ref-3">↑</a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://www.opensource.apple.com/source/cctools/cctools-590/man/lipo.1">lipo.1</a> <a href="Manpage" title="Manpage">manpage</a> im <a href="Quelltext" title="Quelltext">Quelltext</a> (englisch), abgerufen am 21. Juli 2015</span>
</li>
<li id="cite_note-4"><span class="mw-cite-backlink"><a href="#cite_ref-4">↑</a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://sourceware.org/binutils/docs/binutils/objdump.html">objdump(1)</a> manpage (englisch), abgerufen am 21. Juli 2015</span>
</li>
<li id="cite_note-5"><span class="mw-cite-backlink"><a href="#cite_ref-5">↑</a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/file.1.html">file(1)</a> manpage (englisch), abgerufen am 21. Juli 2015</span>
</li>
<li id="cite_note-6"><span class="mw-cite-backlink"><a href="#cite_ref-6">↑</a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://nuclearpixel.com/blog/2010-05-17_lame_3.98.4_universal_for_mac_osx_10.5/">LAME 3.98.4 Universal for Mac OSX 10.5</a> (englisch) – <a href="LAME" title="LAME">LAME</a> als Beispiel für eine <i><span lang="en">Universal Binary</span></i> für vier Architekturen: PowerPC, PowerPC64, i386 und x86-64</span>
</li>
</ol></div><!--htdig_noindex--><div><div class="zim-footer">
Dieser Artikel wurde von <a class="external text" title="Zuletzt bearbeitet am 2025-04-25" href="https://de.wikipedia.org/wiki/?title=Universal_Binary&oldid=255447563">Wikipedia</a> herausgegeben. Der Text ist unter <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.de">Creative Commons Attribution-Share Alike 4.0</a> verfügbar, sofern nicht anders angegeben. Für die Mediendateien können zusätzliche Bedingungen gelten.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>
</body></html>